package com.aididi.java8;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

/**
 * @Auther: zx.xu
 * @Description:    java8函数式接口
 *          有且仅有一个抽象方法的接口,
 *          一旦使用该注解来定义接口，编译器将会强制检查该接口是否确实有且仅有一个抽象方法，否则将会报错
 *          如果不使用该注解，只要满足函数式接口的定义，这仍然是一个函数式接口
 */
@FunctionalInterface
public interface CustomFunctionDemo1 {

    void show1(int a);  //接口里只有一个抽象方法（函数式接口）

    default void show2(String str){ //接口的默认函数，非抽象方法

    }

}

class CustomFunctionDemo2 {
    public static void method(int a, CustomFunctionDemo1 jk) {//使用自定义接口作为方法参数
        jk.show1(a);//调用自定义函数式接口
    }

    private static Comparator<String> longs() {
        return (a, b) -> b.length() - a.length();
    }

    public static void main(String[] args) {
        String[] arr = {"让", "世", "界", "充", "满", "爱", "！！"};
        System.out.println(Arrays.toString(arr));
        Arrays.sort(arr, longs());
        System.out.println(Arrays.toString(arr));

        method(100, a -> {//Lambda 表达式
            System.out.println(a);
        });

        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("jack",22));
        list.add(new Student("mos",32));
        list.sort(Comparator.comparing(Student::getAge));
        list.forEach(System.out::println);

    }



}


class Student{
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
